#ifndef DSCTBL_H
#define DSCTBL_H



/*	1、把limit 和base 分成多段是为了兼容286指令集 ,
	2、其中limit表示该段的空间大小(limit 有3个字节24位，但只使用20位，limit_high的高4位用于写段属性(加上access_right ,段属性一共12位,统称ar)，20位地址一个段最多能操作1MB内存 ，
	为了能让一个段操作4G内存，英特尔在段属性中加入Gbit标志位，为0时基础单位为字节,为1时基础单位为页（4kB/页  ,4KB * 1M = 4G）) ，base表示该段的首地址*/
typedef struct  {  
	short limit_low ,base_low ;
	char base_mid ,access_right ;
	char limit_high,base_high ;
} SEGMENT_DESCRIPTOR; //GDT描述符

typedef struct  { 
	short offset_low ,selector ;
	char dw_count,access_right;
	short offset_high ;
}GATE_DESCRIPTOR; //IDT描述符






		/** dsctbl.c*/
void init_gdtidt(void ); 
void set_segmdesc( SEGMENT_DESCRIPTOR *sd ,unsigned int limit ,int base ,int ar);

void set_gatedesc( GATE_DESCRIPTOR *gd ,int offset, int selector ,int ar);

#define ADR_BOOTINFO	0x00000ff0  //BOOTINFO 地址
#define ADR_DISKIMG		0x00100000  //fat12 磁盘起始地址
#define ADR_IDT			0x0026f800  //IDT 地址
#define LIMIT_IDT		0x000007ff	//IDT 大小
#define ADR_GDT			0x00270000  //GDT地址
#define LIMIT_GDT		0x0000ffff	//GDT大小
#define ADR_BOTPAK		0x00280000   //BOOTPACK地址
#define LIMIT_BOTPAK	0x0007ffff	//BOOTPACK大小
//GDT 段权限代码
#define AR_DATA32_RW	0x4092  //数据段
#define AR_CODE32_ER	0x409a  //代码段
#define AR_TSS32		0x0089  //TSS描述符
#define AR_LDT          0x0082  //LDT描述符
//IDT 权限代码
#define AR_INTGATE32	0x008e


#endif   

	